package com.doitedu.mr.day05;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * @Date 2021/12/1
 * @Created by HANGGE
 * @Description
 * Mapper阶段 继承Mapper类    重写map方法
 * 注意: 在MR内部处理数据的时候是以kv的形式处理的
 * 默认处理的文本文件
 *   Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
 *       KEYIN    输入的key       行的起始位置    Long
 *       VALUEIN  输入的value     行内容         String
 *       KEYOUT   输出的key       单词           String
 *       VALUEOUT  输出的value    次数           Integer
 *  HDP有自己的序列化机制 , 优化JDK序列化的臃肿问题  , 数据量小 , 有利用大量数据持久化和网络传输
 *  Long --LongWritable
 *  Integer --IntWritable
 *  String --Text
 *  double --DoubleWritable
 *
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    /**
     * 一行数据执行一次
     * 重写map方法 处理数据的逻辑
     * map方法会被执行多次   300M --> [ 0  128M ]任务  N行
     * @param key   行的起始位置
     * @param value  当前行内容
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
      // 处理数据  行内容
        String line = value.toString();
        String[] words = line.split("\\s+");
        //将单词和1输出
        for (String word : words) {
            //输出结果数据
            Text kout = new Text(word);
            IntWritable vout = new IntWritable(1);
            context.write(kout , vout);
        }
    }
}
